#pragma once
#include <string>
#include <cstddef> 
#include <odb/nullable.hxx>
#include <odb/core.hxx>
#include <boost/date_time/posix_time/posix_time.hpp>
#include "chat_session_member.hxx"

namespace wzl 
{
    enum class ChatSessionType
    {
        SINGLE=1,
        GROUP=2
    };

    #pragma db object table("chat_session")
    class ChatSession
    {
    public:
        ChatSession()
        {}
        ChatSession(const std::string& ssid,const std::string& ssname,ChatSessionType sstype)
            :_chat_session_id(ssid)
            ,_chat_session_name(ssname)
            ,_chat_session_type(sstype)
        {}
        std::string chat_session_id() {return _chat_session_id;}
        void chat_session_id(std::string& val) {_chat_session_id = val;}

        std::string chat_session_name() {return _chat_session_name;}
        void chat_session_name(std::string& val) {_chat_session_name = val;}

        ChatSessionType chat_session_type() {return _chat_session_type;}
        void chat_session_type(ChatSessionType val) {_chat_session_type = val;}
    private:
        friend class odb::access;
        #pragma db id auto
        unsigned long _id;
        #pragma db type("varchar(64)") index unique
        std::string _chat_session_id;
        #pragma db type("varchar(64)")
        std::string _chat_session_name;
        #pragma db type("tinyint") 
        ChatSessionType _chat_session_type;    //1-表示单聊  2-表示群聊

    };

    //必须指定条件: css::chat_session_type==1 && csm1.user_id==uid && csm2.user_id!=csm1.user_id
    #pragma db view object(ChatSession = css)\
                    object(ChatSessionMember = csm1 : css::_chat_session_id == csm1::_session_id)\
                    object(ChatSessionMember = csm2 : css::_chat_session_id == csm2::_session_id)\
                    query((?))
    struct SingleChatSession
    {
        #pragma db column(css::_chat_session_id)
        std::string chat_session_id;
        #pragma db column(csm2::_user_id)
        std::string friend_id;
    };

    //css::chat_session_type==2 && csm.user_id==uid
    #pragma db view object(ChatSession = css)\
                    object(ChatSessionMember = csm : css::_chat_session_id == csm::_session_id)\
                    query((?))
    struct GroupChatSession
    {
        #pragma db column(css::_chat_session_id)
        std::string chat_session_id;
        #pragma db column(css::_chat_session_name)
        std::string chat_session_name;
    };


    //查询条件:csm1::user_id==uid && csm2::user_id==pid && css::chat_session_type==1

}